package com.platform.common.util;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

/**
 * 身份证信息算法类
 * 
 * @author javaweb
 * 
 */
public class CardUtil {

	/** 中国公民身份证号码最小长度。 */
	public final static int CHINA_ID_MIN_LENGTH = 15;

	/** 中国公民身份证号码最大长度。 */
	public final static int CHINA_ID_MAX_LENGTH = 18;

	/**
	 * 根据身份编号获取生日年
	 * 
	 * @param idCard
	 *            身份编号
	 * @return 生日(yyyy)
	 */
	public static String getYearByCardCode(String idCard) {

		if (StringUtils.isEmpty(idCard)) {
			return "";
		}
		String year = "";
		if (idCard.length() == CHINA_ID_MIN_LENGTH) {
			// 15位
			year = "19" + idCard.substring(6, 8);
		} else {
			// 18位
			year = idCard.substring(6, 10);
		}
		return year;
	}

	/**
	 * 根据身份编号获取生日月
	 * 
	 * @param idCard
	 *            身份编号
	 * @return 生日(MM)
	 */
	public static String getMonthByCardCode(String idCard) {

		if (StringUtils.isEmpty(idCard)) {
			return "";
		}
		String month = "";
		if (idCard.length() == CHINA_ID_MIN_LENGTH) {
			// 15位
			month = idCard.substring(8, 10);
		} else {
			// 18位
			month = idCard.substring(10, 12);
		}
		return month;
	}

	/**
	 * 根据身份编号获取生日天
	 * 
	 * @param idCard
	 *            身份编号
	 * @return 生日(dd)
	 */
	public static String getDateByCardCode(String idCard) {

		if (StringUtils.isEmpty(idCard)) {
			return "";
		}
		String day = "";
		if (idCard.length() == CHINA_ID_MIN_LENGTH) {
			// 15位
			day = idCard.substring(10, 12);
		} else {
			// 18位
			day = idCard.substring(12, 14);
		}
		return day;
	}

	/**
	 * 根据身份编号获取生日
	 * 
	 * @param idCard
	 *            身份编号
	 * @return 生日(yyyyMMdd)
	 */
	public static String getBirthDayByCardCode(String idCard) {
		if (StringUtils.isEmpty(idCard)) {
			return "";
		}
		String birthDay = "";
		if (idCard.length() == CHINA_ID_MIN_LENGTH) {
			// 15位
			birthDay = "19" + idCard.substring(6, 12);// 日
		} else {
			// 18位
			birthDay = idCard.substring(6, 14);
		}
		return birthDay;
	}

	/**
	 * 根据身份编号获取年龄
	 * 
	 * @param idCard
	 *            身份编号
	 * @return 年龄
	 */
	public static int getAgeByCardCode(String idCard) {
		if (StringUtils.isEmpty(idCard)) {
			return 0;
		}
		String year = "";
		if (idCard.length() == CHINA_ID_MIN_LENGTH) {
			// 15位
			year = "19" + idCard.substring(6, 8);
		} else {
			// 18位
			year = idCard.substring(6, 10);
		}
		int iCurrYear = DateUtils.year();
		int iAge = iCurrYear - Integer.valueOf(year);
		return iAge;
	}

	/**
	 * 根据身份编号获取性别
	 * 
	 * @param idCard
	 *            身份编号
	 * @return 性别(M-男，F-女，N-未知)
	 */
	public static String getGenderByCardCode(String idCard) {

		if (StringUtils.isEmpty(idCard)) {
			return "";
		}
		String gender = "未知";
		String sCardNum = "";
		if (idCard.length() == CHINA_ID_MIN_LENGTH) {
			// 15位
			sCardNum = idCard.substring(14, 15);// 用户的性别
		} else {
			// 18位
			sCardNum = idCard.substring(16, 17);
		}
		if (Integer.parseInt(sCardNum) % 2 != 0) {
			gender = "男";// 1-男
		} else {
			gender = "女";// 2-女
		}
		return gender;
	}

	/**
	 * 根据身份证的号码算出当前身份证持有者的性别和年龄
	 * 
	 * @return
	 * @throws Exception
	 */
	public static Map<String, Object> getCardCodeInfo(String cardCode) throws Exception {
		Map<String, Object> map = new HashMap<String, Object>();
		String year = getYearByCardCode(cardCode);// 年
		String month = getMonthByCardCode(cardCode);// 月
		String day = getDateByCardCode(cardCode);// 日
		String birthDay = getBirthDayByCardCode(cardCode);// 生日
		String sex = getGenderByCardCode(cardCode);// 性别
		int age = getAgeByCardCode(cardCode);// 年龄

		map.put("year", year);
		map.put("month", month);
		map.put("day", day);
		map.put("birthDay", birthDay);
		map.put("sex", sex);
		map.put("age", age);

		return map;
	}

	public static void main(String[] a) {

		String idcard = "460200199209275127";
		// String idcard = "460200920927111";

		String sex = getGenderByCardCode(idcard);
		System.out.println("性别:" + sex);

		int age = getAgeByCardCode(idcard);
		System.out.println("年龄:" + age);

		String nian = getYearByCardCode(idcard);
		String yue = getMonthByCardCode(idcard);
		String ri = getDateByCardCode(idcard);
		System.out.println(nian + "年" + yue + "月" + ri + "日");

		String sr = getBirthDayByCardCode(idcard);
		System.out.println("生日:" + sr);
	}

}